package com.it.data_linkedList.leetcode;

/**
 * @Author: Coke
 * @DateTime: 2023/06/05/20:59
 * @注释: 根据值删除节点
 **/
public class E02LeetCode203 {
    
    /**
     * @param head: 链表头
     * @param val:  需要删除的值
     * @return ListNode
     * @作者: Coke
     * @注释: 方法一
     * @DateTime: 2023/6/5 21:09
     */
    public static ListNode removeNodeByVal (ListNode head, int val) {
        ListNode h = new ListNode(- 1, head); // 头哨兵
        ListNode n1 = h;
        ListNode n2 = h.next;
        while (n2 != null) {
            if (n2.val == val) {
                n1.next = n2.next;
            } else {
                n1 = n1.next;
            }
            n2 = n2.next;
        }
        return h.next;
    }
    
    /**
     * @param head: 链表头
     * @param val:  需要删除的值
     * @return ListNode
     * @作者: Coke
     * @注释: 方法二（递归）
     * @DateTime: 2023/6/5 21:35
     */
    public static ListNode removeNodeByVal2 (ListNode head, int val) {
        if (head == null) {
            return null;
        }
        // 相等 返回下一个节点（相当于删除了该节点）继续递归
        if (head.val == val) {
            return removeNodeByVal2(head.next, val);
        } else {
            head.next = removeNodeByVal2(head.next, val);
            return head;
        }
    }
    
}
